\documentclass[11pt]{article}
\author{Ivan Bogouchev \and Ognyan Pertchev \and Gueorgui Tzotchev}
\usepackage[latin1]{inputenc}
\usepackage[francais]{babel}
\usepackage{graphicx}
\usepackage{verbatim}
\title{FOGE2 le retour}
\frenchspacing
\begin{document}
\maketitle

\pagebreak
\tableofcontents
\pagebreak

\section{Pr\'esentation de FOGE2}

FOGE2 (acronyme de FOrm GEnerator) est un logiciel destin\'e \`a la
cr\'eation et \`a la gestion de questionnaires pour le Web, ainsi qu'au
traitement des informations recueillies.
Le FOGE d'origine \'etait d\'evelopp\'e par M. Christian Queinnec et
deux \'etudients en ma\^itrise - R\'emis Bantos et David Haguenauer
ont fait une r\'eecriture OO qui est devenue FOGE2.

Un questionnaire est repr\'esent\'e sous la forme d'une page Web. FOGE2
cr\'e\'e et initialise une base de donn\'ees (des tables SQL), ins\`ere les
r\'eponses des utilisateurs, et ensuite analyse ces informations pour en
extraire et visualiser des statistiques.


\centerline{\includegraphics[width=10cm]{form}}

\section*{}
FOGE2 est construit comme une collection de modules OO, \'ecrits en Perl. Le
questionnaire lui - m\^eme est aussi cr\'e\'e en Perl et interpr\'et\'e par le
serveur comme un script CGI.  Un questionnaire (ou formulaire, d'o\`u le
nom du module - Form.pm, qui est l'objet principale d'un
questionnaire) est constitu\'e d'une suite de sections (module
Section.pm). Une section est une suite de questions (module
Quetion.pm). 

\centerline{\includegraphics[width=10cm]{Diagram1}}

\section*{}
Chaque question d\'efinit comment elle est pos\'ee et quelles sont les
r\'eponses valides pour cette question. Il existe de diff\'erents types
de questions. Chaque type de question a un ou plusieurs types de
statistiques associ\'es. Par exemple des questions qui supposent une
r\'eponse en forme de texte - les questions de type TextField et les
statistiques associ\'ees:

\centerline{\includegraphics[width=10cm]{textfield}}

\centerline{\includegraphics[width=10cm]{statsfree}}

ou des questions dont les r\'eponses sont  pr\'ed\'efinies -  menu
(radio button ou checkbox) et les statistiques associ\'ees:

\centerline{\includegraphics[width=10cm]{multmenu}}

\centerline{\includegraphics[width=10cm]{statspiechart}}

\section{Fonctionement}

Lorsque le script CGI qui d\'efinit le questionnaire est invoqu\'e la
m\'ethode \emph{Form->main} de son objet principal est appel\'ee. En
fonction des parama\`etres fournis au script, cette m\'ethode app\`ele une
m\'ethode appropri\'ee pour:

\begin{itemize}
  \item Servir le questionnaire - \emph{serve} 

  \item Ins\'erer dans la BD les r\'eponses \`a un questionnaire - \emph{handle\_submission}  

  \item Afficher des statistiques - \emph{printstats}

  \item Etc ... \emph{makesql, prinastext, chooseaction, status}

\end{itemize}

Ensuite, apr\`es avoir effectu\'e des v\'erifications des droits (adresse
ip, date, utilisateur distant), cette m\'ethode effectue une partie du 
travail (afficher le text d'introduction de la forme ou des statistiques
globales pour la forme, comme le nombre total de r\'eponses) et app\`ele
les m\'ethodes correspondant des sections qui font partie de la
forme  .
Ces m\'ethodes effectuent une partie du travail et appellent les
m\'ethodes n\'ec\'essaires des questions qui font partie de la section
.

\section{Limites de l'existant}

Quand m\^eme FOGE2 a ses limites :

\begin{itemize}
\item Premi\`erement il n'est pas possible de filtrer les r\'eponses. 
C'est-\`a-dire de choisir un sous ensemble de r\'eponses qui correspond \`a
certains crit\`eres et puis d'en construire des statistiques. L'exemple
le plus simple est si on veut savoir le nombre de r\'eponses  re\c cus
apr\`es 20 heures.

\item Autre inconv\'enient est que toutes les statistiques affich\'ees pour une
quesion sont choisies au moment de la cr\'eation du questionnaire. Le
probl\`eme avec une telle approche est qu'on ne prend pas en compte la
r\'epartition des r\'eponses (car on la connait pas encore) et donc, les
statistiques choisies pour une question ne sont peut-\^etre pas, celles
qui donnent le plus d'informations. On aimerait donc, pouvoir choisir
les statistiques, associ\'ees \`a une question, lors de la consultation et
eventuellement \^etre capable de reconfigurer ce choix et r\'eafficher les
stats. 

\item Des statistiques sont affich\'ees pour la totalit\'e des questions du
fomulaire. Mais pour un long formulaire, on aimerait n'afficher des
stats que pour une partie des questions et pouvoir eventuellement
rechoisir les questions pour lesquelles on aimerait voir des
statistiques. 

\item Actuellement les v\'erifications sur les droits d'ex\'ecution telle ou
telle action sont fait dans plusieurs partie du code et sont tr\`es
basics. On aimerait rafinner ses v\'erifications et unifier l'interface.
Par exemple un professeur a le droit de consulter les statistiques 
partielles et l'\'etat du questionnaire, alors que  les \'etudiants peuvent 
consulter juste le r\'esultat final apr\`es un d\'elai fix\'e.

\end{itemize}

\section{FOGE 3}

\subsection {Les Filtres}

\subsubsection{Pourquoi veut-on filtrer}
Les filtres vont nous permettre de diminuer l'ensemble de recherche et 
de traquer les corr\'elations entre les r\'eponses.


\subsubsection{Fonctionnement}
Pour expliquer comment on a impl\'ement\'e les filtres, regardons d'abord
comment les statistiques sont calcul\'ees actuellement.

Dans une table (qu'on appelera \emph{foge\_answer}) sont stock\'es, pour
chaque soumission, un identificateur de la soumission, l'adresse ip d'ou
la soumission a \'et\'e faite, la date, et le nom du questionnaire.

Pour chaque section de la forme, existe une table, dont la premi\`ere
colonne et un identificateur, r\'ef\'eren\c cant les identificateurs stock\'es
dans la table \emph{foge\_anwer} et les autre colonnes correspondent
aux questions qui font partie de la section.

\subsubsection{La solution}
Donc pour qualculer les statistiques pour une question on fait la
jointure sur l'attribut \emph{id} de \emph{foge\_answer} et la relation
de la section qui contient la question. Actuellement, cette jointure
ne fait pas grand chose (c\`ad le nombre de r\'eponses consid\'er\'ees n'est
pas diminu\'e), mais cela nous permet de filtrer les soumissions
consid\'er\'ees en rempla\c cant la table \emph{foge\_answer} par une table
qui contient juste les r\'eponses qui nous int\'eressent.

Ex:
\begin{verbatim}
  CREATE TEMP TABLE foge\_answer As
  SELECT f.*
  FROM foge_answer f, section00 s
  WHERE f.id = s.id AND s.question = "foo";
\end{verbatim}

La table foge\_answer contient maintenant juste les soumissions qui ont
r\'epondu "foo" \`a la question "question" de la section
"section00". Ainsi les statistiques seront calcul\'ees sur le
sous-ensemble des soumission qui ont r\'epondu "foo" \`a la question
"question".

On a impl\'ement\'e deux types de filtres : les filtres ``simple'' et les
filtres "template".

Un filtre "simple" extrait un sous ensemble de r\'eponses qui 
correspond \`a un crit\`ere. Par exemple si on s'int\'eresse juste \`a
l'avis des \'etudiants qui ont assist\'es \`a plus de 5 cour on va filtrer
sur la valeur de la r\'eponse \`a la question "A combien de cours
avez-vous assist\'e ?".

Un filtre dit "template" extrait un sous ensemble des r\'eponses qui
correspond \`a un certain mod\`ele du questionnaire.
Cela va marcher de la mani\`ere suivante : Un professeur par exemple, va
r\'epondre (au memme questionnaire que les \'etudiants) avec les r\'eponses qui
l'int\'eressent et le programme va afficher l'ensemble des \'etudiants qui
ont r\'epondu de mani\`ere similaire (\`a ces questions).


\subsection{Choisir dynamiquement les Statsistiques}

\subsubsection{Avantages}
Actuellement, les statistiques sont pr\'esent\'ees \`a l'utilisateur sous
forme d'une page HTML. Elles sont choisies au pr\'ealable par le
concepteur d'un questionnaire. L'inconvenient d'une telle approche est
que le choix des statistiques pour une question ne prenne pas en
compte la r\'epartition des r\'eponses (car on ne la connait pas
encore). Pour cette raison on aimerait pouvoir choisir et configurer
les statistiques lors de la consultation.

\subsubsection{Comment on fait}
Apr\`es voir affich\'e les statistiques pour une question don\'ee, on
pr\'esente \`a l'utilisateur une liste, contenant les noms des statistiques
convenables pour ce type de question. Il peut en choisir celles qui
lui conviennent et r\'eafficher la page.

\centerline{\includegraphics[width=10cm]{statsdyna}}

Cela impose que pour chaque type de question, on doit savoir quelles
sont les stats compatibles.

\subsubsection{La solution}
Chaque classe, impl\'ementant un type de question, contient un hachage,
dont les cl\`es sont les noms des statistiques convenables pour ce type
de question et les valeurs sont des fonctions anonymes capables de
construire l'objet Stats correspondant \`a la cl\`e.
Lorsque l'utilisateur demande le r\'eaffichage de la page des
statistiques (en appuiants sur le boutton 'r\'eafficher'), le script
re\c coit dans le query string la liste des statistiques choisies par
l'utilisateur et rempla\c ce celles qui \'etaient cod\'ees dans le script par
celle que l'utilisateur vient de choisir.

\begin{verbatim}
my @stat_names = CGI::param($question_name . 'stats');

my %stat_constructors =
  ('StatsPiechart' => sub {CGI::FOGE2::StatsPiechart->new()},
   'StatsSimple' => sub {CGI::FOGE2::StatsSimple->new()},
   'StatsDouble' => sub {CGI::FOGE2::StatsDouble->new()},
  );

my $stat_constructor = $stat_constructors{$stat_name};
my $stat = &$stat_constructor();
push @stats, $stat;

\end{verbatim}

\subsection{Voir les r\'eponses Fiche par fiche}
Une des exigeances de M. Queinnec. \'etait d'impl\'ementer la consultation des
r\'eponses fiche par fiche, c\`ad voir comment une personne a r\'epondu \`a la
totalit\'e des questions d'un formulaire.

Actuellement notre solution consiste \`a pr\'esenter \`a l'utilisateur un
tableau HTML, o\`u chaque ligne repr\'esente la soumission d'une personne
et les colonnes contiennent les r\'eponses aux questions.


\subsection{Les statistiques crois\'ees}

\subsubsection{Utilit\'ee}
L'id\'ee des statistiques crois\'ees est de voir la r\'epartion des r\'eponses
\`a une question en fonction des r\'eponses possibles \`a une autre
question. Ex:

Question 1: A combient de cours avez-vous assist\'e? 
       moins de 5,  entre 5 et 10, plus de 10.

Question 2: Comment trouvez-vous le cours? nul, bien, super

Donc, les statistiques crois\'ees sont utiles si on s'int\'eresse \`a l'avis
des \'etudiants en fonction du  nombre de fois qu'ils sont all\'e au cour.

\centerline{\includegraphics[width=10cm]{statscroisees}}

Et \c ca montre que le cours n'\'etait pas appr\'eci\'e par les \'etudiant qui y
sont pas all\'e (on pouvait s'y attendre :)

\subsubsection{Comment on fait}
Pour l'affichage des stats crois\'ees on utilise le module perl
\emph{GD::Graph} qui est d\'edi\'ee \`a la cr\'eation de graphiques
statistiques.

Et pour le calcul de la r\'epartition on se base sur cette requ\^ete SQL: 

\begin{verbatim}
	SELECT count(*), Section1.Question1, Secton2.Question2
	FROM foge_answer, Section1, Section2
	WHERE foge_answer.id = Section1.id AND Section1.id = Section2.id
	GROUP by Section1, rel_2.col_2;
\end{verbatim}

\subsection{S\'ecurit\'e}


\end{document}
